<?php 

class ocorrencia_ocorrenciasModel extends Model{
    public    $tabela = "ocorrencia_ocorrencias";
    public    $pkey   = 'cod_ocorrencia';
    protected $model_label       = "Assuntos";
    protected $model_description = "
        Os assuntos serão utilizados para dar o andamento dos asssuntos da empresa.
        ";
    
    public $dados  = array(
        'cod_ocorrencia' => array(
	    'name'     => 'Assunto',
	    'type'     => 'int',
	    'size'     => '11',
	    'pkey'    => true,
	    'ai'      => true,
	    'notnull' => true,
            'private' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        
        'grupo' => array(
	    'name'     => 'Grupo',
	    'type'     => 'int',
	    'size'     => '11',
	    'notnull' => true,
	    'grid'    => true,
            'especial' => 'session',
            'session' => 'ocorrencia/grupo',
	    'display' => true,
	    'fkey' => array(
	        'model' => 'ocorrencia/grupo',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_grupo', 'nome'),
                'onupdate' => 'cascade',
                'ondelete' => 'restrict',
	    )
        ),
        
        'assunto' => array(
	    'name'     => 'Assunto',
	    'type'     => 'varchar',
	    'size'     => '64',
            'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        
        'descricao' => array(
	    'name'     => 'Descrição',
	    'type'     => 'text',
            'especial' => 'editor',
            'editor'   => array('format', 'list', 'link', 'history'),
            'display'  => true,
            'mobile_hide' => true,
	    'notnull'  => true,
        ),
        
        'tipo' => array(
	    'name'     => 'Status',
	    'type'     => 'enum',
	    'default' => 'andamento',
	    'options' => array(
	    	'andamento'  => 'Em Andamento',
	    	'concluido'  => 'Concluído',
	    	'paralisado' => 'Paralisado',
	    	'cancelado'  => 'Cancelado',
                'excluido'   => 'Excluído',
	    ),
            'description' => array(
                'tipo'       => 'Selecione Status para este assunto',
                'andamento'  => 'O assunto segue seu andamento normal',
	    	'concluido'  => 'Arquiva o assunto',
	    	'paralisado' => 'Exibe os Assuntos mas não permite envio de mensagens',
	    	'cancelado'  => 'Cancela o assunto mas mantém os dados arquivados',
                'excluido'   => 'Envia o assunto para a lixeira e exclui definitivamente após 15 dias, neste período ela pode ser restaurada',
            ),
            'mobile_hide' => true,
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        
        'status_label' => array(
	    'name'     => 'Detalhes do Status',
	    'type'     => 'varchar',
	    'size'     => '64',
            'default'  => 'Em Andamento',
	    'grid'    => true,
	    //'display' => true,
            'description' => "Descreva brevemente o motivo do status atual deste assunto"
        ),
        
        'criado_por' => array(
	    'name'     => 'Criado por',
	    'type'     => 'int',
	    'size'     => '11',
	    'notnull' => true,
            'mobile_hide' => true,
	    'grid'    => true,
            'especial' => 'autentication',
            'autentication' => array(
                'needlogin' => true
            ),
	    'fkey' => array(
	        //'model' => 'usuario/login',
                'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name'),
                'onupdate' => 'cascade',
                'ondelete' => 'restrict'
	    ),
         ),
        
        'solicitante' => array(
	    'name'     => 'Solicitante',
	    'type'     => 'int',
	    'size'     => '11',
	    'notnull' => true,
            'mobile_hide' => true,
	    'grid'    => true,
	    'display' => true,
	    'fkey' => array(
	        //'model' => 'usuario/login',
                'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name'),
                'onupdate' => 'cascade',
                'ondelete' => 'restrict'
	     ),
            'description' => "Pessoa que motivou o assunto (geralmente quem apontou o problema a ser resolvido)"
         ),
        
        'envolvidos' => array(
            'name' => 'Participantes',
            'type' => 'int',
            'mobile_hide' => true,
            'fkey' => array(
                'cardinalidade' => 'nn',
                'model' => 'ocorrencia/envolvido',
                'keys'  => array('cod_usuario', 'user_name'),
                'formmodel' => 'ocorrencia/ocorrencias',
                'sort'      => 'user_name ASC',
                'onupdate' => 'cascade',
                'ondelete' => 'cascade'
            ),
            'description' => "Usuários que poderão enviar, receber e visualizar as mensagens deste assunto"
        ),
        
        'criadoem' => array(
	    'name'     => 'Data de Criação',
	    'type'     => 'timestamp',
	    'notnull' => true,
            'mobile_hide' => true,
	    'grid'    => true,
	    'display' => true,
            'default' => "CURRENT_TIMESTAMP",
            'especial' => 'hide'
        ),
        
        'atualizacao' => array(
	    'name'     => 'Última Atualização',
	    'type'     => 'datetime',
	    //'notnull' => true,
            //'default' => "NULL",
	    'grid'    => true,
	    'display' => true,
            'especial' => 'hide'
        ),
        
        'excluidoem' => array(
	    'name'     => 'Data de Exclusão',
	    'type'     => 'date',
            'especial' => 'hide'
        ),
        
        'encerradoem' => array(
	    'name'     => 'Data de encerramento',
	    'type'     => 'date',
	    'grid'    => true,
            'especial' => 'hide',
	    //'display' => false,
        ),
       
         'previsao_encerramento' => array(
	    'name'        => 'Previsão de Encerramento',
	    'type'        => 'date',
            'mobile_hide' => true,
	    //'notnull' => false,
	    'grid'        => true,
	    'display'     => true,
            'especial'    => 'calendar',
            'description' => "Data limite prevista para o término deste assunto, após esta data ela será considerada como atrasada.",
            'button'      => "Salvar Assunto",
          ),
        
    );
    
    private $filther_functions = array(
        "Não Lidas" => 'ocorrencia/ocorrencias/status/unread',
        "Ativas" => 'ocorrencia/ocorrencias/status/ativas',
        "Arquivadas" => 'ocorrencia/ocorrencias/status/arquivadas',
        "Todas" => 'ocorrencia/ocorrencias/status/all',
        "Lixeira" => 'ocorrencia/ocorrencias/status/lixeira',
        "Em Atraso" => 'ocorrencia/ocorrencias/status/atraso',
        "Importantes" => 'ocorrencia/ocorrencias/status/importante',
        "Solicitadas por mim" => 'ocorrencia/ocorrencias/status/solicitadas',
        "Onde sou responsável" => 'ocorrencia/ocorrencias/status/responsavel',
        "Pedido de Parecer" => 'ocorrencia/ocorrencias/status/convidado',
    );
    
    public function __construct() {
        parent::__construct();
        $this->LoadModel('usuario/login', 'uobj');
        //$this->LoadModel('usuario/login', 'uobj');
        $this->cod_usuario = $this->uobj->getCodUsuario();
    }
    
    private $otherfilthers = array('Lixeira',"Em Atraso", "Importantes", "Solicitadas por mim", "Onde sou responsável", "Pedido de Parecer");
    public function getFilters(){
        foreach($this->filther_functions as $name => $link){
            $last = explode("/", $link);
            $last = end($last);
            $total = $this->$last(0, 1, "", true);
            unset($this->filther_functions[$name]);
            if($total > 0){
                if(in_array($name, $this->otherfilthers)) $this->filther_functions['Opções']["$name ($total)"] = $link;
                else $this->filther_functions["$name ($total)"] = $link;
            }
        }
        $this->LoadJsPlugin('menu/multiple', 'menu_sec_obj');
        $this->menu_sec_obj->imprime();
        $var = $this->menu_sec_obj->draw($this->filther_functions);
        EventTube::addEvent("body-top", $var);
        
        return $this->filther_functions;
    }
    
    public function getItem($cod_item, $campo = "", $refresh = false, $campos = array()) {
        if(!$this->uobj->UserIsAdmin()){
            $this->LoadModel('ocorrencia/envolvido', 'env');
            $tb = $this->env->getTable();
            $this->db->Join($this->tabela, $tb);
        }
        $var = parent::getItem($cod_item, $campo, $refresh, $campos);
        return $var;
    }
    
    public function solicitadas($page, $qtd = 10, $cod_usuario = "", $count = false){
        $cod = ($cod_usuario == "")? $this->cod_usuario:$cod_usuario;
        $where = "criado_por = '$cod' AND tipo != 'excluido'";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function unread($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "lida = 'n' AND tipo != 'excluido'";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function ativas($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "(tipo='andamento' OR tipo='paralisado')";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function arquivadas($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "(tipo !='andamento' AND tipo != 'paralisado' AND tipo != 'excluido')";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function convidado($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "(tipo_envolvimento = 'convidado' AND tipo != 'excluido')";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function responsavel($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "tipo_envolvimento = 'responsavel'";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function atraso($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "(previsao_encerramento < NOW() AND previsao_encerramento != '0000-00-00') AND (tipo = 'andamento' OR tipo = 'paralisado') AND tipo != 'excluido'";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function all($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "tipo != 'excluido'";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }

    public function importante($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "importante = 's' AND tipo != 'excluido'";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function lixeira($page, $qtd = 10, $cod_usuario = "", $count = false){
        $where = "tipo = 'excluido'";
        if(!$count) return $this->byStatus($page, $qtd, $where, __FUNCTION__, $cod_usuario);
        return $this->countByStatus($where, $cod_usuario);
    }
    
    public function countByStatus($where, $cod_usuario = ""){
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $etable = $this->env->getTable();
        $cod_usuario = ($cod_usuario == "")?$this->cod_usuario:$cod_usuario;
        $wh = "`$etable`.`cod_usuario` = '$cod_usuario'";
        $where = ($where != "")? "WHERE $where AND $wh":$wh;
        
        $this->db->Join($this->tabela, $etable, array('cod_ocorrencia'), array('cod_ocorrencia'), "LEFT");
        $this->LoadResource("database", "db");
        $join = $this->db->getJoin();
        $arr  = ($this->db->ExecuteQuery("SELECT COUNT( * ) as count FROM  `$this->tabela` $join $where"));
        //echo "<br/><br/> \n\n" .$this->db->getSentenca() . "\n\n <br/><br/>";
        $this->db->setJoin("");
        if(empty ($arr)) return 0;
        $count = (count($arr) > 1)?count($arr):$arr[0]['count'];
        return $count;
    }
    
    private function byStatus($page, $qtd, $where, $status, $cod_usuario = ""){
        $this->LoadResource("html/paginator", 'pag');
        $this->LoadResource("html", 'html');
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $etable = $this->env->getTable();
        $this->db->Join($this->tabela, $etable, array('cod_ocorrencia'), array('cod_ocorrencia'), "LEFT");
        
        $link = "ocorrencia/ocorrencias/status/$status";
        $link = $this->html->getLink($link);
        
        $campos = $this->getCampos(array());
        $this->pag->setJoin($this->db->getJoin());
        
        $cod_usuario = ($cod_usuario == "")?$this->cod_usuario:$cod_usuario;
        $wh = "`$etable`.`cod_usuario` = '$cod_usuario'";
        $where = ($where != "")? "$where AND $wh":$wh;
        
        $this->pag->setWhere($where);
        $this->pag->Paginacao($this->tabela, $link, $qtd, $page);
        //$this->pag->startDebug();
        //$var = $this->pag->selecionar($this, $campos, $where, "atualizacao DESC");
        $var = $this->pag->selecionar($this, $campos, $where, "nome ASC, atualizacao DESC");
        //print_r($var);
        //die();
        return $var;
    }
    
    public function has_permission($cod_ocorrencia, $canalter = false){

        //se usuário é admin, então ele tem permissão
        if($this->uobj->UserIsAdmin()) return true;
        
        //se ocorrencia é inválida
        if($cod_ocorrencia == "") return false;
        
        //verifica o envolvimento do usuário na ocorrencia
        $add = (!$canalter)? "": "AND tipo_envolvimento = 'responsavel'";
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $total = $this->env->getCount("
            cod_ocorrencia    = '$cod_ocorrencia' AND 
            cod_usuario       = '$this->cod_usuario' $add
        ");
        if($total != 0) return true;
        
        
        $item = $this->getItem($cod_ocorrencia);
        $this->LoadModel('ocorrencia/grupo', 'gobj');
        return $this->gobj->CheckPermissao($item['__grupo']);
    }
    
    public function getDados() {
        $var = parent::getDados();
        if(CURRENT_MODULE == "ocorrencia") unset($var['tipo']['options']['excluido']);
        //if(isset($_SESSION['ocorrencia/grupo']) && !is_admin) unset ($var['grupo']);
        
        $participantes = array();
        $cod_usuario = $this->cod_usuario;
        if(isset($_SESSION['ocorrencia/ocorrencias'])){
            $this->LoadModel('ocorrencia/envolvido', 'env');
            $participantes = $this->getEnvolvidos($_SESSION['ocorrencia/ocorrencias']);
        }else $participantes[] = $this->uobj->getItem($cod_usuario);
        
        if(!empty ($participantes)){
            $out = array();
            foreach($participantes as $e){
                $out[] = array('user_name' => $this->uobj->getUserNick($e), 'cod_usuario' =>$e['cod_usuario']);
            }
            $var['envolvidos']['default'] = $out;
        }
       
        $usuario = $this->uobj->getUserNick($this->uobj->getItem($cod_usuario));
        $var['solicitante']['default'] = array($cod_usuario => $usuario);
        return $var;
    }
    
    private function change($item, $post){
        $out = "";
        $alowed_camps = array('assunto', 'tipo', 'status_label', 'previsao_encerramento', 'descricao');
        $item['previsao_encerramento'] = convertData($item['previsao_encerramento']);
        foreach($post as $name => $var){
            if(!in_array($name, $alowed_camps))  continue;
            if(!array_key_exists($name, $item))  continue;
            if(trim($item[$name]) == trim($var)) continue;
            $out .= "<p><b>Novo(a) "  . $this->dados[$name]['name']."</b>: $var</p>";
            $out .= "<p><b>Antigo(a) ". $this->dados[$name]['name']."</b>: ".$item[$name]."</p><hr/>";
        }
        return $out;
    }
    
    public function editar($id, $post, $camp = "") {
        
        //edita os dados da ocorrencia
        if((isset($_SESSION['ocorrencia/grupo']) && !isset($post['grupo'])) || $post['grupo'] == "") $post['grupo'] = $_SESSION['ocorrencia/grupo'];
        $post['atualizacao'] = date("d/m/Y H:i:s");

        //carrega a ocorrencia do banco de dados
        $item = $this->selecionar(array(), "cod_ocorrencia = '$id'");
        
        //edita a ocorrencia
        if(!parent::editar($id, $post, $camp)) return false;
        
        //gera uma mensagem de log caso a ocorrencia tenha sofrido algum modificacao
        if(empty ($item)) return true;
        $str  = $this->change($item[0], $post);
        
        if($str != ""){
            $cod_usuario = $this->cod_usuario;
            $email = $this->uobj->getUserNick($this->uobj->getItem($cod_usuario));
            $dados['texto'] = "<h3>Modificações no assunto: </h3><p><b>Autor da modificação</b>: $email <hr/> $str";
            $dados['destinatarios']  = implode("," ,array_keys($this->getEnvolvidos($id)));
            $dados['cod_ocorrencia'] = encrypt::encrypt_camp($id);
            $dados['cod_autor']      = $cod_usuario;
            $dados['sistema']        = 's';
            $this->LoadModel('ocorrencia/mensagem', 'msg');
            $this->msg->ignore_status();
            if(!$this->msg->inserir($dados)){
                $this->setErrorMessage($this->msg->getErrorMessage());
                return false;
            }
        }

        return true;
    }
    
    public function nova_atualizacao($cod_ocorrencia){
        $dados['atualizacao'] = timeResource::getFormatedDate();
        return parent::editar($cod_ocorrencia, $dados);
    }
    
    public function inserir($dados) {
        $envolvidos = explode(',', $dados['envolvidos']);
        $denv       = $dados['envolvidos'];
        unset($dados['envolvidos']);
        if(isset($_SESSION['ocorrencia/grupo']) && (!isset($dados['grupo']) || $dados['grupo'] == "")) $dados['grupo'] = $_SESSION['ocorrencia/grupo'];
        
        $dados['atualizacao'] = date("d/m/Y H:i:s");
        if(!parent::inserir($dados)) return false;
        $cod_ocorrencia = $this->getLastId();
        
        //salva o usuário que criou a discussão como envolvido na mesma
        $cod_criador               = $this->cod_usuario;
        $post['cod_usuario']       = $cod_criador;
        $post['tipo_envolvimento'] = 'envolvido';
        $post['lida']              = 's';
        if(QUEM_CRIA_OCORRENCIA_E_RESPONSAVEL_POR_ELA) $post['tipo_envolvimento'] = 'responsavel';
        if(!$this->saveEnvolvidoDadosForm($cod_ocorrencia, $post))return false;
        
        //salva os outros usuários como envolvidos
        $post['tipo_envolvimento'] = 'envolvido';
        $post['lida']              = 'n';
        foreach($envolvidos as $env){
            if($env == $cod_criador) continue;
            $post['cod_usuario'] = $env;
            $this->saveEnvolvidoDadosForm($cod_ocorrencia, $post);
        }
        
        $env_ = $this->uobj->selecionar(array('email'), "cod_usuario IN($denv) AND cod_usuario != '$this->cod_usuario'");
        $this->notificar($env_, $cod_ocorrencia);
        return true;
    }
    
    public function apagar($valor, $chave = "") {
        
        $cod = $valor;
        if($chave != $this->pkey){
            $item = $this->getItem($valor, $chave);
            $cod = $item[$this->pkey];
        }
        $this->LoadResource('upload', 'up');
        if(!$this->up->apagar('ocorrencia/ocorrencias/'.$cod)){
            $this->setErrorMessage(OCORRENCIA_IMPOSSIVEL_APAGAR_PASTA);
            return false;
        }
        return parent::apagar($valor, $chave);
    }
    
    public function coletor(){
        $data = Date('Y-m-d', strtotime("-15 days"));
        $query = "DELETE FROM $this->tabela WHERE tipo = 'excluido' and excluidoem <= '$data'";
        return $this->db->ExecuteQuery($query);
    }
    
    public function getOcorrenciaMensagens($cod_ocorrencia, $page, $count = 10){
        $this->LoadModel('ocorrencia/mensagem', 'msg');
        $campos = $this->msg->getCampos();

        $values = $cod_ocorrencia;
        $keys   = "cod_ocorrencia";
        $link = "ocorrencia/ocorrencias/show/$cod_ocorrencia";
        $var = $this->msg->paginate($page, $link, $values, $keys, $count, $campos, '');
        //echo $this->db->getSentenca(); print_r($var); 
        return $var;
    }
    
    private $filter = array();
    public function filter($filtro){
        $keys = array_keys($this->dados['tipo']['options']);
        foreach($filtro as $f){
            if(in_array($f, $keys)) $this->filter[] = $f;
        }
    }
    
    private $where = array();
    public function addWhere($where){
        $this->where[] = $where;
    }
    
    private $order = "";
    public function setOrder($order){
        $this->order = $order;
    }
    
    public function paginate($page, $link = "", $cod_item = "", $campo = "", $qtd = 20, $campos = array(), $adwhere2 = "", $orderby = ""){
        //verifica se usuário é admin, se for, ele tem acesso todal
        $addwhere = $this->where;
        $addwhere[] = $adwhere2;
        $access = false;
        $this->LoadClassFromPlugin('ocorrencia/grupo/grupoSecurity', 'gr');
        if(isset($_SESSION['ocorrencia/grupo']) && CURRENT_ACTION != "sub") {
            $access = $this->gr->SuperiorHierarquico($_SESSION['ocorrencia/grupo']);
            $addwhere[] = "$this->tabela.grupo = '".$_SESSION['ocorrencia/grupo']."'";
        }
        if($this->uobj->UserIsAdmin()){$access = true;}
        
        if(!empty($this->filter)){
            $or = $add = "";
            foreach($this->filter as $f){
                $add .= "$or $this->tabela.tipo = '$f' ";
                $or = " OR ";
            }
            $addwhere[] = "($add)";
        }

        if($access == false){
            //se usuario não é admin, verifica se ele é envolvido
            $this->LoadModel('ocorrencia/envolvido', 'en');
            $tb = $this->en->getTable();
            $this->db->Join($this->tabela, $tb, array('cod_ocorrencia'), array('cod_ocorrencia'), "LEFT");
            $cod_usuario = $this->uobj->getCodUsuario();
            $addwhere[] = "$tb.cod_usuario = '$cod_usuario' AND in_blacklist = 'n'";
        }
        
        $this->LoadResource("html/paginator", 'pag');
        $this->LoadResource("html", 'html');
        $where = ($cod_item == "")?$cod_item : $this->genWhere($campo, $this->pkey, $cod_item);
        if($where != "") $addwhere[] = $where;
        $where = (empty ($addwhere))? "": implode(" AND ", $addwhere);
        $link = ($link == "")? CURRENT_MODULE . "/" . CURRENT_CONTROLLER."/show/" : $link;
        $link = $this->html->getLink($link);
        $campos = empty ($campos)?$this->getCampos($campos):$campos;
        $this->pag->setJoin($this->db->getJoin());
        $this->pag->setWhere($where);
        $this->pag->Paginacao($this->tabela, $link, $qtd, $page);
        $ordem = $this->order == ""?"atualizacao DESC":$this->order;
        //$this->pag->startDebug();
        $var =  $this->pag->selecionar($this, $campos, $where, $ordem);
        $this->where = array();
        return $var;
    }
    
    public function getPaginateCount(){
        $this->LoadResource("html/paginator", 'pag');
        return $this->pag->getLastCount();
    }
        
    public function getMensagemForm($cod_ocorrencia){
        $dados = $this->msg->getDados();
        //$dados['cod_ocorrencia']['default'] = $cod_ocorrencia;
        //$dados['cod_ocorrencia']['especial'] = 'hidden';
        //unset($dados['cod_ocorrencia']['fkey']);
        return $dados;
    }
    
    public function saveEnvolvidoForm($cod_ocorrencia, $post){

        if(empty ($post)) return true;
        unset($post['gerpessoas']);
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $all = $this->env->selecionar(array("cod_usuario"), "cod_ocorrencia = '$cod_ocorrencia'");
        
        //evita inserção de duplicatas
        $out = array();
        foreach($all as $a) $out[$a['cod_usuario']] = true;
        
        //insere/edita os dados
        $i = 0;
        $this->LoadResource('html', 'html');
        $this->LoadModel('contato/alertas', 'aobj');
        
        $item = $this->getItem($cod_ocorrencia);
        $temp = array();
        if(is_array($post['cod_usuario'])){
            foreach($post as $key => $ps){
                foreach($ps as $l => $p) 
                    $temp[$l][$key] = $p;
            }    
        }else $temp[] = $post;
        
        
        foreach($temp as $t){

            //se usuário não estava relacionado à esta discussão
            if(!array_key_exists($t['cod_usuario'], $out)){
                if($t['tipo_envolvimento'] != ""){
                    $t['lida']           = 'n';
                    $t['importante']     = 'n';
                    $t['in_blacklist']   = 'n';
                    if(!$this->env->inserir($t)){
                        $this->setErrorMessage($this->env->getErrorMessage());
                        return false;
                    }

                    //envia o novo email com o conteúdo da discussão
                    $assunto = $item['assunto'];
                    $link    = $this->html->getLink('ocorrencia/ocorrencias/show/'.$item['cod_ocorrencia']);
                    $texto   = ACOMPANHAR_PELO_SITE." <a href='$link'>".CLIQUE_AQUI."</a>";
                    $user    = $this->uobj->getItem($t['cod_usuario']); $user = $user['email'];
                    $autor   = $this->uobj->getItem($item['criado_por']);
                    if(!$this->aobj->alertar($assunto, $texto, $user, $autor)){
                        $this->setAlertMessage(ERRO_AO_ENVIAR_EMAIL . " $user");
                    }

                }
            }

            //se usuário já estava envolvido
            else{

                //se envolvimento existe então atualiza o usuário
                if($t['tipo_envolvimento'] != ""){
                    if(!$this->env->editar(array($t['cod_usuario'], $cod_ocorrencia), $t)){
                        $this->setErrorMessage($this->env->getErrorMessage());
                        return false;
                    }
                }

                //se o novo tipo de envolvimento não existe, então apaga o envolvimento do usuário
                else{
                    if(!$this->env->apagar(array($t['cod_usuario'], $cod_ocorrencia))){
                        $this->setErrorMessage($this->env->getErrorMessage());
                        return false;
                    }
                }
            }
        }
        $this->setAlertMessage('');
        $this->setErrorMessage('');
        $this->setSuccessMessage(ENVOLVIDO_SALVO_CORRETAMENTE);
        return true;
    }
    
    public function getEnvolvidos($cod_ocorrencia, $enablecache = true){
        static $cache = array();
        if(array_key_exists($cod_ocorrencia, $cache) && $enablecache) return $cache[$cod_ocorrencia];
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $t1 = $this->env->getTable();
        $t2 = $this->uobj->getTable();
        
        $add = "";
        $is_admin = $this->uobj->UserIsAdmin();
        if(!$is_admin){
            $add = "AND cod_usuario != '$this->cod_usuario'";
        }
        $this->db->Join($t1, $t2);
        $all = $this->env->selecionar(
                array('cod_usuario', 'email', 'user_name','user_cargo', 'tipo_envolvimento'), 
                "cod_ocorrencia = '$cod_ocorrencia' $add"
         );
        $out = array();
        if(!empty ($all)){
            foreach($all as $a)
                $out[$a['cod_usuario']] = $a;
        }
        $cache[$cod_ocorrencia] = $out;
        //print_r($cache);
        return $out;
    }
    
    public function saveEnvolvidoDadosForm($cod_ocorrencia, $post){
        if(empty ($post)) return true;
        if(!isset ($_POST['enviar'])) return true;
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $all = $this->env->selecionar(
                array("cod_usuario", 'tipo_envolvimento'), 
                "cod_usuario = '".$post['cod_usuario']."' AND cod_ocorrencia = '$cod_ocorrencia'"
        );
        
        $post['cod_ocorrencia'] = $cod_ocorrencia;
        $post['lida']           = array_key_exists('lida', $post)?$post['lida']:'n';
        $post['importante']     = 'n';
        $post['in_blacklist']   = 'n';
        $cod_usuario = $post['cod_usuario'];
        if(!empty ($all)){
            $all = array_shift($all);
            if($all['tipo_envolvimento'] == $post['tipo_envolvimento']) return true;
            $bool = $this->env->editar(array($cod_usuario, $cod_ocorrencia), $post);
        }else{
            $bool = $this->env->inserir($post);
            if($bool)$this->addLog($cod_usuario);
        }
        
        $this->setMessages($this->env->getMessages());
        return $bool;
    }
    
    public function getEnvolvidoDadosForm($cod_ocorrencia){
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $dados = $this->env->getDados();
        asort($dados['tipo_envolvimento']['options']);
        $dados['tipo_envolvimento']['default'] = 'envolvido';
        /*unset($dados['cod_ocorrencia']);
        unset($dados['lida']);
        unset($dados['importante']);
        unset($dados['in_blacklist']);
        unset($dados['data_envolvimento']);*/
        //debugarray($dados);die();
        return $dados;
    }
    
    public function restaurarExcluido($id){
        $post['tipo']         = "andamento";
        $post['status_label'] = "Em andamento";
        $post['excluidoem']   = "FUNC_NULL";
        if(!$this->editar($id, $post)){
            $this->setErrorMessage(OCORRENCIA_IMPOSSIVEL_RESTAURAR);
            return false;
        }
        
        $this->LoadModel('ocorrencia/mensagem', 'msg');
        $cod_usuario = $this->cod_usuario;
        $email = $this->uobj->getItem($cod_usuario);
        $email = $email['email'];
        $dados['texto']          = OCORRENCIA_MENSAGEM_REATIVACAO." ". Date('d/m/Y H:i:s') . ". Pelo usuário: $email";
        $dados['destinatarios']  = implode("," ,  array_keys($this->getEnvolvidos($id)));
        $dados['cod_ocorrencia'] = $id;
        $dados['cod_autor']      = $cod_usuario;        
        if(!$this->msg->inserir($dados)){
            $this->setAlertMessage($this->msg->getErrorMessage());
            return false;
        }
        
        return true;
    }
    
    public function setExcluido($id){
        
        $id = $this->antinjection($id);
        $item = $this->selecionar(array('tipo'), "cod_ocorrencia = '$id'");
        if(!empty ($item)){
            $item = array_shift($item);
            if(OCORRENCIA_APAGAR_LIXEIRA && $item['tipo'] == 'excluido') return $this->apagar($id);
        }
       
        $this->LoadModel('ocorrencia/mensagem', 'msg');
        $total = $this->msg->getCount("cod_ocorrencia = '$id' AND sistema = 'n'");
        if($total == 0) return parent::apagar($id);
        
        $post['tipo']         = "excluido";
        $post['status_label'] = "Excluído";
        $post['excluidoem']   = Date('d/m/Y');
        $horario              = Date('H:i:s');

        //notifica a exclusao da mensagem
        $usuario = $this->uobj->getUserNick($this->uobj->getItem($this->cod_usuario));
        $dados['texto'] = OCORRENCIA_MENSAGEM_EXCLUSAO ." ". Date('d/m/Y') . " $horario. Pelo usuário: $usuario";
        $dados['destinatarios']  = implode("," , array_keys($this->getEnvolvidos($id)));
        $dados['cod_ocorrencia'] = $id;
        $dados['cod_autor']      = $this->cod_usuario;
        $dados['sistema']        = 's';
        if(!$this->msg->inserir($dados)) $this->setAlertMessage($this->msg->getErrorMessage());

        if(!$this->editar($id, $post)){
            $this->setErrorMessage(OCORRENCIA_IMPOSSIVEL_ALTERAR);
            return false;
        }
        return true;
    }
    
    private function notificar($users, $cod_ocorrencia){
                
        //gera a lista de emails
        if(empty ($users)) return true;
        foreach($users as $u) $destinatarios[] = $u['email'];
        
        //gera o texto da mensagem
        $this->LoadResource('html', 'html');
        $link    = $this->html->getLink("ocorrencia/ocorrencias/show/$cod_ocorrencia");
        $link2   = $this->html->getLink('ocorrencia/ocorrencias/status/unread');
        
        //recupera a ocorrencia para gerar a notificacao
        $ocorrencia = $this->selecionar(array('assunto', 'descricao'), "cod_ocorrencia = '$cod_ocorrencia'", 1, "", "criadoem DESC");
        if(empty ($ocorrencia)){
            $this->setAlertMessage('Não foi possível notificar os usuários!');
            return false;
        }
        else $ocorrencia = array_shift($ocorrencia);
        
        //gera a mensagem
        $autor = $this->uobj->getItem($this->cod_usuario);
        $autor_email = $autor['email'];
        $texto   = "<h2>".NOVA_OCORRENCIA." $autor_email</h2>";
        if(OCORRENCIA_MENSAGEM_SHOW_FULL_MSG) $texto .= $ocorrencia['descricao'] . "<br/><br/>";
        $texto  .= VISUALIZAR_OCORRENCIA_NO_LINK." <a href='$link'>".CLIQUE_AQUI."</a><hr/>";
        $texto  .= VISUALIZAR_TODAS_AS_MENSAGENS. " <a href='$link2'>".CLIQUE_AQUI."</a>";
        
        //envia o alerta
        $this->LoadModel('contato/alertas', 'aobj');
        $this->aobj->alertar($ocorrencia['assunto'], $texto, $destinatarios, $autor);
        return true;
    }
    
    public function can_post_message($cod_ocorrencia){
        $item = $this->selecionar(array('tipo'), "cod_ocorrencia = '$cod_ocorrencia'");
        if(empty($item)) return false;
        $item = array_shift($item);
        $tipo = trim($item['tipo']);
        return ($tipo == "andamento");
    }
}
?>